{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n1tfEdYdWctolT/w14vNvvMEukek58DsT313nN6ddjjv95Phhc/NA6c/IDcux1YOjnQfONnGHN+08\nfLM7Jjvtktu0NPH8f6Q7dbNPfcHEwSUzt9Zc7L7Yxzb8qmtTpypn46aIfYRIk76rTTzwc7sub/bm\nQ5x2NQMr/XIWLpFIMmRzxLpjXvibiReeY+eHO95+s9OuwcOl7/s63AkDAOAJSRgAAE/KzXB0UiU7\n/Dh/SHsTLz7HHfZ6Zqsdwnrv/jNN3PzdsKGuDDu8OLN5R6dOn2PXRqTstksoUr6eXthuIwr/O/H5\nQMn9XDnwD7vkod75c2N6/jov2mv/zQa7Zdbdw3/Lr3m+Fnxuf68aMBwtIiIqxf3zU6FLdMO7h/3P\nDjG2DBuCDsqZt8i26+3WndjPjoE+ducIE3etlOW0Cw5Pf51+uPskDEcXKGfLFhPPGGmndGoscZcJ\n5SyMPBUUreRd+d9PtuuxwClve7jIL1XsuBMGAMATkjAAAJ6QhAEA8CRh54STqrjb1K1+s7GJF3e2\nyxOe2tLSaTfh5pNNnPbtzxGfP/hV+ipbtjt1gyZPNPGodfar+du+PkCnEZPDK9htJsO3xJu60C4r\nyZCiz+Glz7bzuT/sdZc51Z6THd7c0CpiVbmV3KiBU5565Fv5tntmazOn3PoFO9eYE944SnVG2Lnk\nsX2PMnHXepHnmBG72qP8/Lv2rPO7U35DGkRo6Q93wgAAeEISBgDAk4Qajg4OQc9/8jCnLjgE/cTm\nVib+rldbp13yssJ/XX7lte6QdrfKE0y8+SD7fK/WaO+0y9m6rdCvhb86ZfaFJv7ysHedujFdR5n4\nIXGXkkUru5vdVe2gB+w0RLMU9/rVuX2ZiXd95D6Hyv/c8nJt+aX1Itbt1HYZy9sPn+nUVZ8beZoo\nFkuvbWLiH8e7p6V1qRgy8aJ+bn+b3Wt3hNLZkaciUPwyz+rslK/tPjHfdh9u6BT2k9K3PJA7YQAA\nPCEJAwDgSUINR/95ZQcTL+71rFP3yW67yf9357Yzcfay5UV+3X3VI481zttrh7AYfo6PtEH21/j5\n992pgX7VF5p44XNHm7jtf9c67dafbr81ec5Nk5y63jXsoR71UoKnNLgnNrzabLyJe/ZwN47Prsx4\ntIhIcu1aJr7zmncjtnt/h/1We/U3inf4OVzOHLur0jUT+jl1i3vZaax5vd2/KWd/ENiGa9rs+HSu\n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\n4hLFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dfbbf5f860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.22846, the validation accuracy is 0.9258\n",
      "after 200 training steps, the loss is 0.337202, the validation accuracy is 0.9574\n",
      "after 300 training steps, the loss is 0.061524, the validation accuracy is 0.964\n",
      "after 400 training steps, the loss is 0.0873153, the validation accuracy is 0.9708\n",
      "after 500 training steps, the loss is 0.0845837, the validation accuracy is 0.971\n",
      "after 600 training steps, the loss is 0.0709643, the validation accuracy is 0.976\n",
      "after 700 training steps, the loss is 0.116743, the validation accuracy is 0.9794\n",
      "after 800 training steps, the loss is 0.0678635, the validation accuracy is 0.9778\n",
      "after 900 training steps, the loss is 0.216148, the validation accuracy is 0.9782\n",
      "after 1000 training steps, the loss is 0.0392329, the validation accuracy is 0.983\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9852\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nXyRSRaIqY8/Qgc5ynbc/N7Ee1MvEq06u5+Q78pgvTfzJh/vFLL/1Z8Umrv3G7ITrSa7gPPDy8d1N\nPLX5eCdfSSD+fkFrE3cG54SJiIgojdgJExERhYTD0Qna+vtDTLzxN+4Q8XUHvGPi8xr8J67yJmxt\n5yz/rv6rJm58Ru2Yf3dSm/5xlU9U2WU3a2ri4sl1TPzvrvc5+dYV55q4YdY0E7fLqYuYRnwcM2n9\n73eZ+IcHazlpf7r9ChM3/b/PYpdPv7Dy731NvPjoB008bOUJTr6Nt3U0ced3Zqa/YpUMj4SJiIhC\nwk6YiIgoJByOjpDVt6eJl/7Znm35yfH3O/maZ8+xf5OCfZmRDb+LeCX2EDRRdbT8ATsls6zHhECK\nO8zcItvGj27pZuLPt7tTOmt2Noq5rmyx5+S+1f2NqGUDwOQx95j44iWXO2lZ0+eDYtvboijq6ws/\n6eosd3ynZg/z80iYiIgoJOyEiYiIQsJOmIiIKCScE46ws2N9Ey8/4bFASp1fZk7Sv7bYu2I99+2A\nhMpoiK9TVZ1qL6ufvbvSnlbu3ZVWn2LvSnb6wDlOWqHaicKPJtm7N7X+31Ynn36xKCX1rCn00L7O\n8uTDHg8s2Z+md3a7c8J3jh5h4vqLNtiEnzc5+bI2fx973Vm2Tbvde6mJF5/5kJOvc26+iXeP2eak\nNTzf3hmv6Kd1MddVU+Xm7zXx9hIbt3uvIIzqVFo8EiYiIgoJO2EiIqKQVNvh6Jy2bZzlJde2NXHL\nGXboscEL7h1asgrUxMsL7RDK90Xu5Q775mwx8flfjXDSNi+xd/5pOceW12iGOzymO3aYuOEWDiun\ngh7ez1leeZmNnz/0/0zcv1bEtSjxGm1v8L/7mr1O0vgtdrj70QWDnLSuI5eYuGSPe4e1mqqwoXt3\nqn617M9RCez3ZvSTFzr59n11homLkaAS+5ddrrS/AT1ruZchLfztAyb+334vO2mH/8oOYzd8lsPR\n2V06OsuLjppo4it+ONbm++hzkMUjYSIiopCwEyYiIgoJO2EiIqKQVKs54exGDU088K1VTtrUZq+b\n+PC57rxPUN7b9vKU0Seeb+LiRcvcdfW0t15rsuwbJ61JyfKoZUe/iRslouQIO/e72k7N4a3DH3Hy\ndc4JXlpm54Hf2+1ecnb94lNMvOU7d/7/q1PsZSs3rLNPz7q71VwnX9869iHk9w2c7KT97crzTdz2\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dfbc517898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
